import cv2
filename = r'../week2/lena.jpg'
img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) # 将图像转换为单通道灰度图像

# Sobel算子边缘检测,分别对x，和y方向计算梯度

sobel_x = cv2.Sobel(img, -1, 1, 0, ksize =3)  # 第二个参数-1代表我们希望输出的图像矩阵和原图有同样的depth
sobel_y = cv2.Sobel(img, -1, 0, 1, ksize =3)

# 经过卷积之后，会出现溢出的问题，需要转换

abs_x = cv2.convertScaleAbs(sobel_x)
abs_y = cv2.convertScaleAbs(sobel_y)
sobel_show = cv2.addWeighted(abs_x, 0.5, abs_y, 0.5, 0) # 将两个矩阵叠加,综合考虑水平和垂直方向的像素灰度值变化强度,得到边缘

# # Canny边缘检测，最小阈值50，最大阈值150,选取系数TH和TL，比率为2:1或3:1.为了适应人眼看，并进行多次对比，选择TH：TL在3:1和2:1之间
canny = cv2.Canny(img, 50, 135, L2gradient=True) # L2gradient=True,使边缘检测更精确

cv2.imshow('gray', img)
cv2.imshow('Sobel', sobel_show)
cv2.imshow('Canny', canny)
cv2.waitKey()
cv2.destroyAllWindows()